import os
from pprint import pprint
import sys
from datetime import datetime, date, time, timedelta
import json
from collections import Counter, defaultdict, OrderedDict, namedtuple, deque
import random

"""
# 获取和切换工作目录
print("当前目录:", os.getcwd())
os.chdir("../09")  # 切换目录
print("切换后:", os.getcwd())

# 目录管理
os.makedirs("test_dir/sub_dir", exist_ok=True)  # 递归创建
os.rmdir("test_dir/sub_dir")  # 删除空目录
os.rmdir("test_dir")  # 删除空目录
print("目录内容:", os.listdir("."))

file_path = "2025/10/example.bak"

# 路径分解
print("目录名:", os.path.dirname(file_path))
print("文件名:", os.path.basename(file_path))
print("路径分割:", os.path.split(file_path))
print("扩展名:", os.path.splitext(file_path))

# 环境变量操作
pprint(os.getenv("PATH"))
pprint(dict(os.environ))

# 执行系统命令
result = os.system("dir -l")
print("命令结果:", result)

# 获取解释器信息
print("Python版本:", sys.version)
print("平台信息:", sys.platform)
print("可执行文件路径:", sys.executable)
# 处理命令行参数
print("命令行参数:", sys.argv)

# 参数检查
if len(sys.argv) < 2:
    print("缺少参数")
    sys.exit(1)  # 错误退出

# 查看模块搜索路径
print("模块搜索路径:")
for path in sys.path:
    print(" ", path)

# 添加自定义路径
sys.path.append("/custom/module/path")
# 标准输入输出流
sys.stdout.write("标准输出\n")
sys.stderr.write("错误输出\n")
# 对象引用计数
x = [1, 2, 3]
a = x
b = x
c = x
print("引用计数:", sys.getrefcount(x))  # 5

# 获取当前时间
now = datetime.now()
print("当前时间:", now)
print("格式化时间:", now.strftime("%Y-%m-%d %H:%M:%S"))
# 创建特定时间
dt = datetime(2024, 1, 15, 14, 30, 0)
print("特定时间:", dt)
# 时间加减
tomorrow = now + timedelta(days=1)
last_week = now - timedelta(weeks=1)
print("明天:", tomorrow.strftime("%Y-%m-%d %H:%M:%S"))
print("上周:", last_week.strftime("%Y-%m-%d %H:%M:%S"))

# 时间差计算
time_diff = tomorrow - now
print("时间差:", time_diff)
print("相差天数:", time_diff.days)
print("相差秒数:", time_diff.total_seconds())
# 获取时间各部分
print("年:", now.year)
print("月:", now.month)
print("日:", now.day)
print("时:", now.hour)
print("分:", now.minute)
print("秒:", now.second)
print("星期:", now.weekday() + 1)

# Python对象转JSON字符串
data = {
    "name": "张三",
    "age": 25,
    "is_student": False,
    "hobbies": ["读书", "编程", "音乐"],
    "address": {"city": "北京", "street": "朝阳区"},
}

json_str = json.dumps(data, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_str)
# JSON字符串转Python对象
parsed_data = json.loads(json_str)
print("解析后的数据:", parsed_data)
print("姓名:", parsed_data["name"])

# 写入JSON文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

# 读取JSON文件
with open("data.json", "r", encoding="utf-8") as f:
    loaded_data = json.load(f)
    print("从文件加载的数据:", loaded_data)


# 自定义对象编码
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


class PersonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return {"name": obj.name, "age": obj.age}
        return super().default(obj)


person = Person("李四", 30)
person_json = json.dumps(person, cls=PersonEncoder, ensure_ascii=False)
print("自定义对象JSON:", person_json)

# 统计元素出现次数
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
word_count = Counter(words)
print("词频统计:", word_count)
print("出现最多的2个:", word_count.most_common(2))

# 更新计数器
word_count.update(["apple", "grape"])
print("更新后的计数器:", word_count)

# 默认值为列表的字典
dd = defaultdict(list)
dd["fruits"].append("apple")
dd["fruits"].append("banana")
dd["vegetables"].append("carrot")
print("默认字典:", dict(dd))


# 自定义默认值函数
def default_value():
    return "未知"


dd2 = defaultdict(default_value)
dd2["name"] = "张三"
print("存在的键值:", dd2["name"])
print("键不存在时的值:", dd2["nonexistent"])
from collections import OrderedDict

# 有序字典（Python 3.7+ 内置dict已有序）
od = OrderedDict()
od["z"] = 1
od["a"] = 2
od["c"] = 3
print("有序字典:", list(od.keys()))

# 有序字典（Python 3.7+ 内置dict已有序）
od = OrderedDict()
od["z"] = 1
od["a"] = 2
od["c"] = 3
print("有序字典:", list(od.keys()))

# 定义命名元组
Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)
print("点坐标:", p)
print("x坐标:", p.x)
print("y坐标:", p.y)

# 双端队列
dq = deque([1, 2, 3])
dq.append(4)  # 右端添加
dq.appendleft(0)  # 左端添加
print("双端队列:", dq)
print("右端弹出:", dq.pop())
print("左端弹出:", dq.popleft())
import re

text = "小王的邮箱是: kwang@mail.com, 电话: 188-1234-5678。还有一个邮箱：abc_xyz@company.org, 另外电话: 139-8765-4321。"

# 1. match：只检查是否从开头匹配
result = re.match(r"小王的邮箱是", text)
if result:
    print("match - 匹配到字符串开头:", result.group())

# 2. search：查找第一个邮箱
email = re.search(r"\w+@\w+\.\w+", text)
if email:
    print("search - 第一个邮箱:", email.group())

# 3. findall：查找所有电话号码
phones = re.findall(r"\d{3}-\d{4}-\d{4}", text)
print("findall - 所有电话:", phones)

# 4. finditer：遍历所有邮箱并打印位置信息
print("finditer - 所有邮箱位置和内容:")
for match in re.finditer(r"\w+@\w+\.\w+", text):
    print(f"邮箱: {match.group()}，起始: {match.start()}，结束: {match.end()}")

# 5. split：按中文全角逗号和冒号分割
fragments = re.split(r"[：:，,]", text)
print("split - 分割结果:", fragments)

# 6. compile：预编译正则以提高多次匹配效率
pattern = re.compile(r"\w+@\w+\.\w+")
emails = pattern.findall(text)
print("compile - 所有邮箱:", emails)

# 7. 分组匹配
m = re.match(r"(\w+)的邮箱是: (\w+@\w+\.\w+)", text)
if m:
    print("match.group(0):", m.group(0))  # 整体
    print("match.group(1):", m.group(1))  # "小王"
    print("match.group(2):", m.group(2))  # 邮箱

# 8. sub：替换所有数字为*
anonymized = re.sub(r"\d", "*", text)
print("sub - 隐私处理后:", anonymized)

# 基本随机数
print("0-1随机浮点数:", random.random())
print("1-10随机整数:", random.randint(1, 10))
print("1-100随机偶数:", random.randrange(0, 101, 2))
print("5.0-10.0随机浮点数:", random.uniform(5.0, 10.0))
# 正态分布
print("正态分布随机数:", random.gauss(0, 1))

# 设置随机种子
random.seed(42)
print("固定种子结果1:", random.randint(1, 100))
random.seed(42)
print("固定种子结果2:", random.randint(1, 100))
random.seed(43)
print("固定种子结果2:", random.randint(1, 100))
random.seed(43)
print("固定种子结果2:", random.randint(1, 100))
items = ["apple", "banana", "cherry", "date"]

# 随机选择
print("随机选择:", random.choice(items))
print("随机选择多个允许重复:", random.choices(items, k=3))
print("随机抽样不允许重复:", random.sample(items, 2))

# 打乱序列
random.shuffle(items)
print("打乱序列:", items)


# 生成验证码
def generate_verification_code(length=6):
    characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    return "".join(random.choices(characters, k=length))


print("验证码:", generate_verification_code())
import math

# 数学常量
print("π的值:", math.pi)
print("e的值:", math.e)
# 基础运算
print("平方根:", math.sqrt(16))
print("绝对值:", math.fabs(-5.5))
print("2的3次方:", math.pow(2, 3))
print("e的2次方:", math.exp(2))
print("自然对数:", math.log(10))
print("以10为底的对数:", math.log10(100))
# 角度与弧度转换
angle_rad = math.radians(45)
print("45度的正弦值:", math.sin(angle_rad))
print("45度的余弦值:", math.cos(angle_rad))
print("45度的正切值:", math.tan(angle_rad))

# 反三角函数
print("反正弦:", math.degrees(math.asin(0.5)))
# 取整函数
print("向上取整:", math.ceil(3.2))
print("向下取整:", math.floor(3.8))
print("四舍五入:", round(3.5))
print("截断小数:", math.trunc(3.9))
import itertools

# 计数器
counter = itertools.count(10)
print("从10开始的计数:")
for i in range(3):
    print(next(counter))

# 循环迭代器
cycler = itertools.cycle("ABC")
print("循环重复:")
for i in range(5):
    print(next(cycler))

# 重复迭代器
repeater = itertools.repeat("hello", 3)
print("重复元素:", list(repeater))
"""
# 导入操作系统模块
import os

# 导入json模块用于数据序列化和反序列化
import json

# 导入datetime和timedelta用于日期处理
from datetime import datetime, timedelta

# 导入defaultdict和Counter用于数据结构
from collections import defaultdict, Counter

# 导入random模块用于生成随机数
import random


# 定义创建示例数据文件的函数
def create_sample_data():
    # 函数用途说明
    """创建示例数据文件"""
    # 生成包含10个用户的字典，每个用户有id、姓名、年龄、加入日期、分数
    data = {
        "users": [
            {
                "id": i,
                "name": f"User_{i}",
                "age": random.randint(18, 60),
                "join_date": (
                    datetime.now() - timedelta(days=random.randint(0, 365))
                ).strftime("%Y-%m-%d"),
                "score": random.randint(50, 100),
            }
            for i in range(1, 11)
        ]
    }

    # 确保data目录存在，不存在则创建
    os.makedirs("data", exist_ok=True)

    # 以utf-8编码写入JSON文件
    with open("data/users.json", "w", encoding="utf-8") as f:
        json.dump(data, f, indent=2, ensure_ascii=False)

    # 打印数据已创建的信息
    print("示例数据已创建: data/users.json")


# 定义分析用户数据的函数
def analyze_user_data():
    # 函数用途说明
    """分析用户数据"""
    try:
        # 打开并读取data/users.json文件
        with open("data/users.json", "r", encoding="utf-8") as f:
            data = json.load(f)
    # 文件未找到时提示用户
    except FileNotFoundError:
        print("数据文件不存在，请先运行 create_sample_data()")
        return
    # JSON数据格式出错时提示用户
    except json.JSONDecodeError:
        print("数据文件格式错误")
        return

    # 获取所有用户数据
    users = data["users"]

    # 用Counter统计所有用户的年龄分布
    age_distribution = Counter(user["age"] for user in users)
    # 输出年龄分布信息
    print("\n年龄分布:")
    # 对年龄和人数按年龄从小到大输出
    for age, count in sorted(age_distribution.items()):
        print(f"  {age}岁: {count}人")

    # 用defaultdict按照分数段分组
    score_groups = defaultdict(list)
    for user in users:
        # 计算分数区间（如70-79）
        score_range = f"{(user['score'] // 10) * 10}-{(user['score'] // 10) * 10 + 9}"
        # 添加用户名到对应分数区间
        score_groups[score_range].append(user["name"])

    # 输出分数分组信息
    print("\n分数分组:")
    # 按分数区间从小到大输出分组信息
    for score_range, names in sorted(score_groups.items()):
        print(f"  {score_range}分: {', '.join(names)}")

    # 统计总用户数
    total_users = len(users)
    # 计算平均年龄
    avg_age = sum(user["age"] for user in users) / total_users
    # 计算平均分数
    avg_score = sum(user["score"] for user in users) / total_users

    # 输出摘要统计
    print(f"\n统计摘要:")
    print(f"  总用户数: {total_users}")
    print(f"  平均年龄: {avg_age:.1f}岁")
    print(f"  平均分数: {avg_score:.1f}分")


# 定义根据id获取用户信息的函数
def get_user_by_id(user_id):
    # 函数用途说明
    """根据ID获取用户信息"""
    try:
        # 打开并读取data/users.json文件
        with open("data/users.json", "r", encoding="utf-8") as f:
            data = json.load(f)
        # 遍历所有用户
        for user in data["users"]:
            # 如果id匹配，则返回该用户
            if user["id"] == user_id:
                return user
        # 未找到则返回None
        return None
    # 文件未找到则输出提示，返回None
    except FileNotFoundError:
        print("数据文件不存在")
        return None


# 定义获取分数最高用户的函数，默认取前5名
def get_top_users(limit=5):
    # 函数用途说明
    """获取分数最高的用户"""
    try:
        # 打开并读取data/users.json文件
        with open("data/users.json", "r", encoding="utf-8") as f:
            data = json.load(f)
        # 获取所有用户数据
        users = data["users"]
        # 将用户按分数降序排列，取前limit个
        top_users = sorted(users, key=lambda x: x["score"], reverse=True)[:limit]
        # 打印前top N名用户信息
        print(f"\n前{limit}名用户:")
        for i, user in enumerate(top_users, 1):
            print(f"  {i}. {user['name']} - {user['score']}分")
        # 返回最高分的用户列表
        return top_users
    # 文件未找到时输出提示，返回空列表
    except FileNotFoundError:
        print("数据文件不存在")
        return []


# 定义根据年龄范围搜索用户的函数
def search_users_by_age(min_age, max_age):
    # 函数用途说明
    """根据年龄范围搜索用户"""
    try:
        # 打开并读取data/users.json文件
        with open("data/users.json", "r", encoding="utf-8") as f:
            data = json.load(f)
        # 获取所有用户数据
        users = data["users"]
        # 按年龄范围过滤用户
        filtered_users = [user for user in users if min_age <= user["age"] <= max_age]
        # 输出筛选结果
        print(f"\n年龄在 {min_age}-{max_age} 岁的用户:")
        # 若有符合条件的用户则逐一输出
        if filtered_users:
            for user in filtered_users:
                print(f"  {user['name']} - {user['age']}岁 - {user['score']}分")
        # 否则提示没有符合条件的用户
        else:
            print("  没有找到符合条件的用户")
        # 返回符合条件的用户列表
        return filtered_users
    # 文件未找到时输出提示，返回空列表
    except FileNotFoundError:
        print("数据文件不存在")
        return []


# 只有在模块作为脚本直接运行时才执行以下代码
if __name__ == "__main__":
    # 打印分隔线
    print("=" * 50)
    # 输出系统标题
    print("用户数据分析系统")
    # 再打印分隔线
    print("=" * 50)

    # 创建样本数据
    create_sample_data()

    # 分析用户数据
    analyze_user_data()

    # 显示分数前5名用户
    get_top_users(5)

    # 按指定年龄段搜索用户
    search_users_by_age(25, 35)

    # 打印分析结束标志
    print("\n" + "=" * 50)
    print("分析完成！")
    print("=" * 50)
